package model;

import model.Model.Status;

/*
 * 
 * IModel class
 * 
 * Interface for the model class.
 * 
 */

public interface IModel {

	/**
	 * checkVictory
	 * 
	 * returns a boolean indicating if the level has been beaten
	 * 
	 * @return
	 */
	public boolean checkVictory();

	/**
	 * getBlocks
	 * 
	 * returns the current block list for the level
	 * 
	 * @return
	 */
	public LevelEntity[][] getBlocks();

	/**
	 * getCurrentLemonSprite
	 * 
	 * returns an integer indicating the current sprite of the playerCharacter
	 * 
	 * @return
	 */
	public int getCurrentLemonSprite();

	/**
	 * getCurrentLevel
	 * 
	 * returns an integer relating the the current level number
	 * 
	 * @return
	 */
	public int getCurrentLevel();

	/**
	 * getCurrentLives
	 * 
	 * returns the number of live the playerCharacter has
	 * 
	 * @return
	 */
	public int getCurrentLives();

	/**
	 * getHealth
	 * 
	 * returns an integer indicating the current health of the playerCharacter
	 * 
	 * @return
	 */
	public int getHealth();

	/**
	 * getLoadingLevel
	 * 
	 * returns true when the current level is being loaded
	 * 
	 * @return
	 */
	public boolean getLoadingLevel();

	/**
	 * getPauseState
	 * 
	 * returns an integer indicating if the game is paused or not
	 * 
	 * @return
	 */
	public boolean getPauseState();

	/**
	 * getPlayerHeight
	 * 
	 * returns an integer indicating the current pixel location of the
	 * playerCharacter
	 * 
	 * @return
	 */
	public int getPlayerHeight();

	/**
	 * getStatus
	 * 
	 * returns the status of the playerCharacter ie. Alive, Dead, or GameOver
	 * 
	 * @return
	 */
	public Status getStatus();

	/**
	 * getWorldHead
	 * 
	 * returns an integer indicating the current x location of the
	 * playerCharacter in pixels
	 * 
	 * @return
	 */
	public int getWorldHead();

	/**
	 * loadLevel
	 * 
	 * returns true if the level number that was passed in was loaded correctly
	 * 
	 * @param nextLevel
	 * @return
	 */
	public boolean loadLevel(int nextLevel);

	/**
	 * loadNextLevel
	 * 
	 * returns true if the next game level has been successfully loaded
	 * 
	 * @return
	 */
	public boolean loadNextLevel();

	/**
	 * moveJump
	 * 
	 * tells the model to make the playerCharacter jump
	 */
	public void moveJump();

	/**
	 * moveLeft
	 * 
	 * tells the model to make the playerCharacter move left
	 */
	public void moveLeft();

	/**
	 * moveRight
	 * 
	 * tells the model to make the playerCharacter to move right
	 */
	public void moveRight();

	/**
	 * moveStop
	 * 
	 * tells the model to make the playerCharacter stop moving left or right
	 */
	public void moveStop();

	/**
	 * registerWithModel
	 * 
	 * registers an IModelObserver with the model
	 * 
	 * @param observer
	 */
	public void registerWithModel(IModelObserver observer);

	/**
	 * revivePlayer
	 * 
	 * tells the model to revive the player
	 */
	public void revivePlayer();

	/**
	 * setLoadingLevel
	 * 
	 * sets the model loading level state true or false based upon the boolena
	 * that is passed into it
	 * 
	 * @param loadingLevel
	 */
	public void setLoadingLevel(boolean loadingLevel);

	/**
	 * togglePause
	 * 
	 * toggles the game between paused and unpaused
	 */
	public void togglePause();

	/**
	 * unregisterWithModel
	 * 
	 * unregisters a IModelObserver with a model
	 * 
	 * @param observer
	 */
	public void unregisterWithModel(IModelObserver observer);

	/**
	 * update
	 * 
	 * tells the model to update all of it's functions
	 */
	public void update();

}